// 版权所有2010 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// 下面的原始C代码、长注释和常量
// 来自FreeBSD的/usr/src/lib/msun/src/e_atanh。c 
// 并随附此通知。go代码是原始C.
// 
// ==============================================================================================================================
// Sun Microsystems，Inc.版权所有。
// 
// 由Sun Microsystems，Inc.业务部门SunPro开发。
// 使用、复制、修改和分发本
// 软件的权限是免费授予的，前提是保留本通知
// 的权利。
// /===============================================================================================================================================================================================================
// /
// /
// /\uIEEE754\uAtanh（x）
// 1。通过atanh（-x）=-atanh（x）
// 2将x还原为正。对于x>=0.5 
// 1 2x x 
// atanh（x）=--log（1+-------）=0.5*log1p（2*------------）
// 2 1-x1-x 
// 
// atanh（x）为NaN，如果| x |>1，则为信号；
// atanh（NaN）是没有信号的NaN；
// atanh（+-1）是带信号的+-INF。
// 

// Atanh返回x的反双曲正切。
// 
// 特殊情况是：
// Atanh（1）=+Inf 
// Atanh（±0）=±0 
// Atanh（-1）=-Inf 
// Atanh（x）=NaN如果x<-1或x>1 
func Atanh(x float64) float64 {
	if haveArchAtanh {
		return archAtanh(x)
	}
	return atanh(x)
}

func atanh(x float64) float64 {
	switch {
	case x < -1 || x > 1 || IsNaN(x):
		return NaN()
	case x == 1:
		return Inf(1)
	case x == -1:
		return Inf(-1)
	}
	sign := false
	if x < 0 {
		x = -x
		sign = true
	}
	var temp float64
	switch {
	case x < NearZero:
		temp = x
	case x < 0.5:
		temp = x + x
		temp = 0.5 * Log1p(temp+temp*x/(1-x))
	default:
		temp = 0.5 * Log1p((x+x)/(1-x))
	}
	if sign {
		temp = -temp
	}
	return temp
}
